/*
 * CuatroView.java	1.0 1.0 05/10/09
 *
 * Copyright 2009 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 05/10/09, 11:23:38 AM
 */
package com.ufps.cuatro;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.Timer;

import org.jdesktop.application.Action;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.Task;
import org.jdesktop.application.TaskMonitor;

import com.ufps.cuatro.controlador.UtilController;
import com.ufps.cuatro.controlador.listener.ControllerListenerPopupJTree;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.analizador.CargadorClases;
import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.analizador.UtilAnalizador;
import com.ufps.cuatro.modelo.biblioteca.BibliotecaTrabajo;
import com.ufps.cuatro.modelo.codificacion.PaqueteClass;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorEspejo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorLibre;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorSimple;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.IconoFileChooser;
import com.ufps.cuatro.util.ImplementarAyudaStandar;
import com.ufps.cuatro.util.MsgInfo;
import com.ufps.cuatro.util.Representacion;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.PatronRepresentacionBase;
import com.ufps.cuatro.util.base.TipoDatoRepresentacionBase;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.TesterLoadJar;
import com.ufps.cuatro.util.opciones.MyPreferences;
import com.ufps.cuatro.util.opciones.UtilOpciones;
import com.ufps.cuatro.util.serializacion.TipoProcesoSerializado;
import com.ufps.cuatro.util.wizard.ObjectTempSwapWizard;
import com.ufps.cuatro.util.wizard.UtilWizard;
import com.ufps.cuatro.vistas.JDialogTesterPreLoadJar;
import com.ufps.cuatro.vistas.JInternalFrameErrores;
import com.ufps.cuatro.vistas.JInternalFrameRepresentaciones;
import com.ufps.cuatro.vistas.analizador.JInternalFrameVisor;
import com.ufps.cuatro.vistas.asistente.JInternalFrameComponentesContenedores;
import com.ufps.cuatro.vistas.biblioteca.JInternalFrameBibliotecaComponentes;
import com.ufps.cuatro.vistas.codificacion.JInternalFrameAdministracionCodificacion;
import com.ufps.cuatro.vistas.representacion.JDialogList;
import com.ufps.cuatro.vistas.representacion.JDialogPreferencias;
import com.ufps.cuatro.vistas.util.JInternalFrameAdminProperties;

/**
 * <i><b>CuatroView:</b></i> Ventana principal de la Aplicación. Se encarga de 
 * presentar la Vista de Trabajo.
 *
 * @author  Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 05/10/09
 * @see FrameView
 * @see Observer
 * @see ImplementarAyudaStandar
 */
public class CuatroView extends FrameView implements Observer{

    /**
     * Indicador de Mensajes disponibles.
     */
    public static String strLabel = "";
    private boolean foco = false;

    static{
        init();
    }
    
    private static void init(){
        try{
            UtilAnalizador.objClases = new ArrayList<ObjetoReflexion>();
            //UtilRepresentacion.objTypesData = new ArrayList<ObjetoTipoDatoReflexion>();  
            Utileria.objExceptionPackage = Representacion.objPropiedadesRepresentacion.getPropertiesList("Utileria.java.exception.package");
            Utileria.objExceptionClass = Representacion.objPropiedadesRepresentacion.getPropertiesList("Utileria.java.exception.class");        
        }catch(java.lang.NullPointerException ex){
            System.out.println("Error de Inicialización de Contexto en CuatroView.");
        }
    }    

    /**
     * Constructor por Defecto. Instancia la ventana Principal(Main).
     * @param app Objeto Aplicación.
     */
    public CuatroView(SingleFrameApplication app) {
        super(app);         

        initComponents();         
        Utileria.initFrameApp();
        
        this.jSplitPaneApp.setDividerLocation(0.2);
        this.jSplitPaneExplorer.setDividerLocation(0.5);
        loadExplorerView(false);        
        
        if(!UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_AUTO_APP_PRIMERA_VEZ)){
            UtilOpciones.initApp();
        }        
        
        Utileria.runLog();        

        addMsg(new MsgInfo(MsgInfo.TOOLTIPS, java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("BIENVENIDA"), java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("PARA INICIAR DEBES TENER UN ARCHIVO .JAR PREVIAMENTE CREADO."), false));

        Utileria.strTempDir = "";

        Utileria.objEscritorio = this.jDesktopPaneApp;       

//        Timer timer = new Timer (1000, new ActionListener (){
//            public void actionPerformed(ActionEvent e){
//                for(MsgInfo objMSG : Utileria.objMSG){
//                    if(!objMSG.isVisualizado()){
//                        CuatroView.this.jLabelToolTips.setText((foco) ? strLabel: "");
//                        foco = !foco;
//                        break;
//                    }
//                }
//                //if(!foco)CuatroView.this.jLabelToolTips.setText("");
//            }        
//        });
//        timer.start();

        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();        
        
        ImageIcon icono = resourceMap.getImageIcon(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ICONO.APP.16"));

        this.getFrame().setIconImage(icono.getImage());

        int messageTimeout = resourceMap.getInteger(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("STATUSBAR.MESSAGETIMEOUT"));
        messageTimer = new Timer(messageTimeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("STATUSBAR.BUSYANIMATIONRATE"));
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("STATUSBAR.BUSYICONS[") + i + java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("]"));
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("STATUSBAR.IDLEICON"));
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);

        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if (java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("STARTED").equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if (java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("DONE").equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if (java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("MESSAGE").equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if (java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("PROGRESS").equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });        
        
        //Carga la Biblioteca Global
////        if(UtilRepresentacion.isExistBibliotecaGlobal()){
////            BibliotecaTrabajo objBiblioteca = Utileria.cargarBiblioteca(UtilRepresentacion.strPathBibliotecaGlobal);
////            if(objBiblioteca != null){
////                UtilRepresentacion.objBibliotecaTrabajoGlobal = objBiblioteca;
////            }
////        }
        
        //Carga el Patron por defecto
//        UtilAsistente.objPatron =
//            Utileria.cargarVectorPatron(Utileria.getPathKeyToApp("Utileria.file.name.patron"));
//        if(UtilAsistente.objPatron == null) {
//            UtilAsistente.objPatron = new Vector<ItemPatron>();
//        }
        initStatesButtoms();      
        initDimensionJSplit();
    }   
    
    private void initDimensionJSplit(){
        this.jSplitPaneLayout.setDividerLocation(0.9);        
        this.jSplitPaneApp.setDividerLocation(0.1);
        this.jSplitPaneExplorer.setDividerLocation(0.6);
        
        this.jSplitPaneLayout.setResizeWeight(0.5);
        this.jSplitPaneApp.setResizeWeight(0.5);
        this.jSplitPaneExplorer.setResizeWeight(0.5);        
    }

    /**
     * Agrega Mensaje a una Cola de Visualización de la Ventana Principal.
     * @param objMSG Nuevo Mensaje que se agregara a la Cola de Visialización.
     */
    public static void addMsg(MsgInfo objMSG) {
        try{
            strLabel = java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("<HTML><STRONG>NUEVO MENSAJE!!!</STRONG></HTML>");
            Utileria.objMSG.add(objMSG);
        }catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole("Error al Agregar el Mensaje.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }       
    }

    /**
     * Visualiza el Dialogo Acerca de.
     */
    @Action
    public void showAboutBox() {
        try{
            if (aboutBox == null) {
                JFrame mainFrame = CuatroApp.getApplication().getMainFrame();
                aboutBox = new CuatroAboutBox(mainFrame);
                aboutBox.setLocationRelativeTo(mainFrame);
            }
            CuatroApp.getApplication().show(aboutBox);
        }catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole("Error al Abrir la Ventana de Acerca de.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }        
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        jButtonSave = new javax.swing.JButton();
        jButtonOpen = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        jButtonReboot = new javax.swing.JButton();
        jSeparator8 = new javax.swing.JToolBar.Separator();
        jButton3 = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jButtonLoad = new javax.swing.JButton();
        jSeparator5 = new javax.swing.JToolBar.Separator();
        jButton2 = new javax.swing.JButton();
        jButtonAsistenteEspejo = new javax.swing.JButton();
        jSeparator10 = new javax.swing.JToolBar.Separator();
        jButton1 = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButton4 = new javax.swing.JButton();
        jSeparator11 = new javax.swing.JToolBar.Separator();
        jButtonAyuda = new javax.swing.JButton();
        jLabelToolTips = new javax.swing.JLabel();
        jSeparator12 = new javax.swing.JToolBar.Separator();
        jButtonExit = new javax.swing.JButton();
        jSplitPaneLayout = new javax.swing.JSplitPane();
        jSplitPaneApp = new javax.swing.JSplitPane();
        jDesktopPaneApp = new javax.swing.JDesktopPane();
        jSplitPaneExplorer = new javax.swing.JSplitPane();
        jTabbedPaneMenuUp = new javax.swing.JTabbedPane();
        jTabbedPaneMenuDown = new javax.swing.JTabbedPane();
        jTabbedPaneInfo = new javax.swing.JTabbedPane();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        jMenuItemOpen = new javax.swing.JMenuItem();
        jMenuItemSave = new javax.swing.JMenuItem();
        jSeparator9 = new javax.swing.JPopupMenu.Separator();
        jMenuItemReboot = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        javax.swing.JMenuItem jMenuItemExit = new javax.swing.JMenuItem();
        procesoMenu = new javax.swing.JMenu();
        jMenuItemLoad = new javax.swing.JMenuItem();
        jSeparator7 = new javax.swing.JPopupMenu.Separator();
        jMenuHerramientas = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        jMenuItem9 = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JPopupMenu.Separator();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();
        jPopupMenu1 = new javax.swing.JPopupMenu();
        jMenuItem4 = new javax.swing.JMenuItem();

        mainPanel.setName("mainPanel"); // NOI18N

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setAutoscrolls(true);
        jToolBar1.setName("jToolBar1"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(CuatroView.class, this);
        jButtonSave.setAction(actionMap.get("saveProceso")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(CuatroView.class);
        jButtonSave.setText(resourceMap.getString("jButtonSave.text")); // NOI18N
        jButtonSave.setFocusable(false);
        jButtonSave.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonSave.setName("jButtonSave"); // NOI18N
        jButtonSave.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonSave);

        jButtonOpen.setAction(actionMap.get("loadProceso")); // NOI18N
        jButtonOpen.setText(resourceMap.getString("jButtonOpen.text")); // NOI18N
        jButtonOpen.setFocusable(false);
        jButtonOpen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonOpen.setName("jButtonOpen"); // NOI18N
        jButtonOpen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonOpen);

        jSeparator4.setName("jSeparator4"); // NOI18N
        jToolBar1.add(jSeparator4);

        jButtonReboot.setAction(actionMap.get("reiniciar")); // NOI18N
        jButtonReboot.setText(resourceMap.getString("jButtonReboot.text")); // NOI18N
        jButtonReboot.setFocusable(false);
        jButtonReboot.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonReboot.setName("jButtonReboot"); // NOI18N
        jButtonReboot.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonReboot);

        jSeparator8.setName("jSeparator8"); // NOI18N
        jToolBar1.add(jSeparator8);

        jButton3.setAction(actionMap.get("staticListModeloString")); // NOI18N
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setName("jButton3"); // NOI18N
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton3);

        jSeparator3.setName("jSeparator3"); // NOI18N
        jToolBar1.add(jSeparator3);

        jButtonLoad.setAction(actionMap.get("loadMundo")); // NOI18N
        jButtonLoad.setText(resourceMap.getString("jButtonLoad.text")); // NOI18N
        jButtonLoad.setFocusable(false);
        jButtonLoad.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonLoad.setName("jButtonLoad"); // NOI18N
        jButtonLoad.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonLoad);

        jSeparator5.setName("jSeparator5"); // NOI18N
        jToolBar1.add(jSeparator5);

        jButton2.setAction(actionMap.get("asistenteEspejoSimple")); // NOI18N
        jButton2.setFocusable(false);
        jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton2.setName("jButton2"); // NOI18N
        jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton2);

        jButtonAsistenteEspejo.setAction(actionMap.get("asistenteEspejo")); // NOI18N
        jButtonAsistenteEspejo.setFocusable(false);
        jButtonAsistenteEspejo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonAsistenteEspejo.setName("jButtonAsistenteEspejo"); // NOI18N
        jButtonAsistenteEspejo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonAsistenteEspejo);

        jSeparator10.setName("jSeparator10"); // NOI18N
        jToolBar1.add(jSeparator10);

        jButton1.setAction(actionMap.get("configuracionCodificacion")); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setName("jButton1"); // NOI18N
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton1);

        jSeparator1.setName("jSeparator1"); // NOI18N
        jToolBar1.add(jSeparator1);

        jButton4.setAction(actionMap.get("notificaciones")); // NOI18N
        jButton4.setFocusable(false);
        jButton4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton4.setName("jButton4"); // NOI18N
        jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton4);

        jSeparator11.setName("jSeparator11"); // NOI18N
        jToolBar1.add(jSeparator11);

        jButtonAyuda.setAction(actionMap.get("infoAyudaToolTips")); // NOI18N
        jButtonAyuda.setFocusable(false);
        jButtonAyuda.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonAyuda.setName("jButtonAyuda"); // NOI18N
        jButtonAyuda.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonAyuda);

        jLabelToolTips.setText(resourceMap.getString("jLabelToolTips.text")); // NOI18N
        jLabelToolTips.setName("jLabelToolTips"); // NOI18N
        jToolBar1.add(jLabelToolTips);

        jSeparator12.setName("jSeparator12"); // NOI18N
        jToolBar1.add(jSeparator12);

        jButtonExit.setAction(actionMap.get("salir")); // NOI18N
        jButtonExit.setText(resourceMap.getString("jButtonExit.text")); // NOI18N
        jButtonExit.setFocusable(false);
        jButtonExit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonExit.setName("jButtonExit"); // NOI18N
        jButtonExit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonExit);

        jSplitPaneLayout.setDividerLocation(300);
        jSplitPaneLayout.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
        jSplitPaneLayout.setResizeWeight(0.5);
        jSplitPaneLayout.setAutoscrolls(true);
        jSplitPaneLayout.setName("jSplitPaneLayout"); // NOI18N
        jSplitPaneLayout.setOneTouchExpandable(true);

        jSplitPaneApp.setDividerLocation(150);
        jSplitPaneApp.setAutoscrolls(true);
        jSplitPaneApp.setMinimumSize(new java.awt.Dimension(100, 200));
        jSplitPaneApp.setName("jSplitPaneApp"); // NOI18N
        jSplitPaneApp.setOneTouchExpandable(true);
        jSplitPaneApp.setPreferredSize(new java.awt.Dimension(100, 200));

        jDesktopPaneApp.setName("jDesktopPaneApp"); // NOI18N
        jSplitPaneApp.setRightComponent(jDesktopPaneApp);

        jSplitPaneExplorer.setDividerLocation(180);
        jSplitPaneExplorer.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
        jSplitPaneExplorer.setAutoscrolls(true);
        jSplitPaneExplorer.setMinimumSize(new java.awt.Dimension(50, 50));
        jSplitPaneExplorer.setName("jSplitPaneExplorer"); // NOI18N
        jSplitPaneExplorer.setOneTouchExpandable(true);
        jSplitPaneExplorer.setPreferredSize(new java.awt.Dimension(50, 50));

        jTabbedPaneMenuUp.setName("jTabbedPaneMenuUp"); // NOI18N
        jSplitPaneExplorer.setTopComponent(jTabbedPaneMenuUp);

        jTabbedPaneMenuDown.setName("jTabbedPaneMenuDown"); // NOI18N
        jSplitPaneExplorer.setRightComponent(jTabbedPaneMenuDown);

        jSplitPaneApp.setLeftComponent(jSplitPaneExplorer);

        jSplitPaneLayout.setTopComponent(jSplitPaneApp);

        jTabbedPaneInfo.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
        jTabbedPaneInfo.setAutoscrolls(true);
        jTabbedPaneInfo.setName("jTabbedPaneInfo"); // NOI18N
        jSplitPaneLayout.setRightComponent(jTabbedPaneInfo);

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSplitPaneLayout, javax.swing.GroupLayout.DEFAULT_SIZE, 805, Short.MAX_VALUE)
            .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSplitPaneLayout, javax.swing.GroupLayout.DEFAULT_SIZE, 362, Short.MAX_VALUE)
                .addGap(19, 19, 19))
        );

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        jMenuItemOpen.setAction(actionMap.get("loadProceso")); // NOI18N
        jMenuItemOpen.setText(resourceMap.getString("jMenuItemOpen.text")); // NOI18N
        jMenuItemOpen.setName("jMenuItemOpen"); // NOI18N
        fileMenu.add(jMenuItemOpen);

        jMenuItemSave.setAction(actionMap.get("saveProceso")); // NOI18N
        jMenuItemSave.setName("jMenuItemSave"); // NOI18N
        fileMenu.add(jMenuItemSave);

        jSeparator9.setName("jSeparator9"); // NOI18N
        fileMenu.add(jSeparator9);

        jMenuItemReboot.setAction(actionMap.get("reiniciar")); // NOI18N
        jMenuItemReboot.setName("jMenuItemReboot"); // NOI18N
        fileMenu.add(jMenuItemReboot);

        jSeparator2.setName("jSeparator2"); // NOI18N
        fileMenu.add(jSeparator2);

        jMenuItemExit.setAction(actionMap.get("salirMenu")); // NOI18N
        jMenuItemExit.setName("jMenuItemExit"); // NOI18N
        fileMenu.add(jMenuItemExit);

        menuBar.add(fileMenu);

        procesoMenu.setText(resourceMap.getString("procesoMenu.text")); // NOI18N
        procesoMenu.setName("procesoMenu"); // NOI18N

        jMenuItemLoad.setAction(actionMap.get("loadMundo")); // NOI18N
        jMenuItemLoad.setName("jMenuItemLoad"); // NOI18N
        procesoMenu.add(jMenuItemLoad);

        jSeparator7.setName("jSeparator7"); // NOI18N
        procesoMenu.add(jSeparator7);

        menuBar.add(procesoMenu);

        jMenuHerramientas.setText(resourceMap.getString("jMenuHerramientas.text")); // NOI18N
        jMenuHerramientas.setName("jMenuHerramientas"); // NOI18N

        jMenuItem6.setAction(actionMap.get("optionApp")); // NOI18N
        jMenuItem6.setName("jMenuItem6"); // NOI18N
        jMenuHerramientas.add(jMenuItem6);

        menuBar.add(jMenuHerramientas);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N

        jMenuItem9.setAction(actionMap.get("infoAyudaToolTips")); // NOI18N
        jMenuItem9.setText(resourceMap.getString("jMenuItem9.text")); // NOI18N
        jMenuItem9.setName("jMenuItem9"); // NOI18N
        helpMenu.add(jMenuItem9);

        jSeparator6.setName("jSeparator6"); // NOI18N
        helpMenu.add(jSeparator6);

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setName("statusPanel"); // NOI18N

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 805, Short.MAX_VALUE)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 635, Short.MAX_VALUE)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        jPopupMenu1.setName("jPopupMenu1"); // NOI18N

        jMenuItem4.setAction(actionMap.get("resultadoClasesMundo")); // NOI18N
        jMenuItem4.setName("jMenuItem4"); // NOI18N
        jPopupMenu1.add(jMenuItem4);

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
        setToolBar(jToolBar1);
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Esta Acción Representa la Fase inicial, es decir, carga un archivo
     * .jar lo registra en el ClassLoader y lo descompone extrayendo las entradas
     * .class luego instancia esas entradas y por medio de la reflexión
     * examina el contenido y crea una estructura para las fases siguiente.
     * @return LoadMundoTask @DefinicionReturn
     */
    @Action
    public Task<Object, Void> loadMundo() {
        ResourceMap resourceMap = getResourceMap();        
        Utileria.strTempDir = UtilOpciones.objPreferences.getString(MyPreferences.FILE_OPEN_JAR);
        File objOutPutFileSelected = UtilAnalizador.getFileOpenSelectedJar();
        if(objOutPutFileSelected != null){ 
            if(objOutPutFileSelected.exists()){                
                Utileria.objFileJar = objOutPutFileSelected;
                Utileria.strTempDir = objOutPutFileSelected.getParent();
                UtilOpciones.objPreferences.addOpcion(MyPreferences.FILE_OPEN_JAR, objOutPutFileSelected.getAbsolutePath());
                if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_APP_ACTIVAR_TESTER_JAR)){                        
                    JDialogTesterPreLoadJar objDialog = new JDialogTesterPreLoadJar(CuatroApp.getApplication().getMainFrame(), true);
                    CuatroApp.getApplication().show(objDialog);                
                    switch(objDialog.getActionTesterLoadJar()){
                        case TesterLoadJar.PROCESS_ERROR:                        
                            return null;
                        case TesterLoadJar.PROCESS_CANCEL:
                            UtilRender.msgError("Proceso Cancelado por el Usuario.");
                            return null;
                    }                
                }
                return new LoadMundoTask(getApplication());
            }
            else {
                JOptionPane.showInternalMessageDialog(jDesktopPaneApp, resourceMap.getString("msg.noExisteArchivo"));
            }
        }         
        return null;
    }    

    private class LoadMundoTask extends org.jdesktop.application.Task<Object, Void> {
        public LoadMundoTask(org.jdesktop.application.Application app) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to LoadMundoTask fields, here.            
            super(app);
            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("INICIANDO ANÁLISIS"), 10, 0, 100, 20);
            UtilRender.printlnConsole("Iniciando Análisis", UtilRender.ACTION_NORMAL, false);
        }

        @Override
        @SuppressWarnings("SleepWhileHoldingLock")
        protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.
            JarInputStream jarInput = null;
            ArrayList<ObjetoReflexion> objClasesMundo = new ArrayList<ObjetoReflexion>();
            int i = 0;
            try {
                if(!UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_APP_ACTIVAR_TESTER_JAR)){
                    CargadorClases mc = new CargadorClases();
                    mc.addArchivo(Utileria.objFileJar);
                    System.out.println(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CLASSPATH:"));
                    for (URL url : mc.getURLs()) {
                        System.out.println(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("T") + url.getFile());                    
                        this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("IDENTIFICANDO OBJETO") + url.getFile(), i++, 0, mc.getURLs().length, 10);
                    }
                }
                
                //-------------------------------------------------------------
                //Extraer en codigo
                //-------------------------------------------------------------                
                
                i = 0;
                jarInput = new java.util.jar.JarInputStream(new FileInputStream(Utileria.objFileJar));                
                JarEntry jarEntry;
                long lenInJar = Utileria.objFileJar.length();
                long lenIn = 0;
                UtilAnalizador.objNombresClases = new ArrayList<String>();
                while ((jarEntry = jarInput.getNextJarEntry()) != null) {
                    String strClase = jarEntry.getName();                    
                    lenIn += jarEntry.getSize();
                    if(strClase.endsWith(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString(".CLASS"))){
                        strClase = strClase.replace('/', '.');
                        strClase = UtilAnalizador.eliminarExtensionBack(strClase);
                        if (UtilAnalizador.estaRegistradaEnElClassPath(strClase)) {
                            if(UtilAnalizador.esClaseGrafica(strClase))continue;
                            UtilAnalizador.objNombresClases.add(strClase);
                            this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CLASE ") + strClase + java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString(" REGISTRADA."), (lenIn < 0) ? (int) Math.random() * 100 : lenIn, 0, lenInJar, 10);                            
                            Class<?> objClass;
                            try {
                                objClass = Class.forName(strClase);
                                //Se ignoran las Clases abstractas, las interfaces y las enumeraciones
                                //porque no generan una representación directa si no por medio
                                //de su herencia, aplicación ó contenido
                                if(UtilAnalizador.estaPresenteModificadorEnClase(objClass, java.lang.reflect.Modifier.INTERFACE) ||
                                    objClass.isEnum()){
                                    continue;
                                }
                                //else if(UtilAnalizador.estaPresenteModificadorEnClase(objClass, java.lang.reflect.Modifier.ABSTRACT)){
                                else if(java.lang.reflect.Modifier.isAbstract(objClass.getModifiers())){
                                    ObjetoReflexion obj = new ObjetoReflexion(objClass);
                                    obj.setAbstractClass(true);
                                    objClasesMundo.add(obj);
                                }
                                else{
                                    ObjetoReflexion obj = new ObjetoReflexion(UtilAnalizador.crearInstancia(objClass));
                                    objClasesMundo.add(obj);
                                }
                            } catch (ClassNotFoundException ex) {
                                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                }       
                //FASE 2a: Analisis de los Tipos de Datos Utilizados en el Modelo                
                i = 0;
                this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("INICIANDO ANÁLISIS DE LOS TIPOS DE DATOS UTILIZADOS EN EL MODELO"), 10, 0, 100, 50);
                int lenClass = UtilAnalizador.objNombresClases.size();
                UtilAnalizador.objClases = objClasesMundo;
                for(String strClassPath : UtilAnalizador.objNombresClases){
                    System.out.println(strClassPath);
                    this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANALIZANDO PROPIEDADES Y MÉTODOS DE:  ") + strClassPath, i++, 0, lenClass, 10);                            
                    UtilRepresentacion.procesarClass(strClassPath);                    
                }                
                //FASE 2b: Representación Generica de los Tipos de Datos Analizados
                PatronRepresentacionBase objPatron = GeneradorComponentes.objPatronRepresentacionBase;
                i = 0;
                int lenTipos = UtilRepresentacion.objTypesData.size();
                this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("INICIANDO REPRESENTACIÓN GENERICA DE LOS TIPOS DE DATOS ANALIZADOS"), 10, 0, 100, 50);
                for(ObjetoTipoDatoReflexion objTipoDato : UtilRepresentacion.objTypesData){                                                          
                    if(objTipoDato.isAbstractClass())continue;
                    TipoDatoRepresentacionBase objTipoDatoRepresentacionBase = GeneradorComponentes.devolverTipoDatoRepresentacionBasePorTipoDato(objTipoDato);
                    if(objTipoDatoRepresentacionBase != null){
                        if(objTipoDatoRepresentacionBase.isCollectionObject() || objTipoDatoRepresentacionBase.isArray()){
                            continue;//no se procesan las coleccion ni los array
                        }
                    }
                    try{
                        //ComponenteBase objComponenteBase = GeneradorComponentes.devolverComponenteBasePorTipoDato(objTipoDato);                        
                        //if(objComponenteBase != null){
                            ComponenteDistribuidorGenerador objComponenteGenerador = objPatron.getRepresentacionTipoDato(objTipoDato);
                            if(objComponenteGenerador != null){                        
                                //se actualiza el modo                                
                                objComponenteGenerador.setAuto(true);
                                UtilRepresentacion.objBibliotecaTrabajoLocal.add(objComponenteGenerador);
                                this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TIPO REPRESENTADO: ") + objTipoDato.getStrNombre(), i++, 0, lenTipos, 10);
                            }
                            if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
                                objComponenteGenerador = GeneradorComponentes.generarRepresentacionVinculadorPorComponenteBase(objTipoDato, false);
                                if(objComponenteGenerador != null){                        
                                    //se actualiza el modo                                
                                    objComponenteGenerador.setAuto(true);
                                    UtilRepresentacion.objBibliotecaTrabajoLocal.add(objComponenteGenerador);
                                    this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TIPO REPRESENTADO: ") + objTipoDato.getStrNombre(), i++, 0, lenTipos, 10);
                                }                                
                            }
                            if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
                                objComponenteGenerador = GeneradorComponentes.generarRepresentacionStringPorComponenteBase(objTipoDato, true);
                                if(objComponenteGenerador != null){                        
                                    //se actualiza el modo                                
                                    objComponenteGenerador.setAuto(true);
                                    UtilRepresentacion.objBibliotecaTrabajoLocal.add(objComponenteGenerador);
                                    this.mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TIPO REPRESENTADO: ") + objTipoDato.getStrNombre(), i++, 0, lenTipos, 10);
                                }                                
                            }
                        //}                                            
                    }catch(java.lang.Exception ex){                       
                        Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }                            
                return true;
            } catch (IOException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NoSuchMethodException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    if(jarInput != null){
                        jarInput.close();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return null;  // return your result
        }       
        
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
            mostrar("", 100, 0, 100, 10);
            if(result != null){
                UtilRepresentacion.sort(UtilRepresentacion.objTypesData);
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CORRECTAMENTE."), 100, 0, 100, 10);                                                          
                UtilRender.msgInformacion(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CORRECTAMENTE."));
                CuatroView.this.loadJarBotones();                   
                CuatroView.this.loadExplorerView(true);
                if(!UtilRepresentacion.objBibliotecaTrabajoLocal.getObjNotificacionesModeloAnalizado().isEmpty()){
                    UtilRender.abrirVentanaNotificacionesModeloAnalizado();
                }
            }
            else{
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CON ERRORES."), 100, 0, 100, 10);          
                UtilRender.msgInformacion(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CON ERRORES."));
            }
            mostrar("", 0, 0, 100, 10);
        }
        
        private void mostrar(String msg, int i, int ini, int fin, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);                
            }
            if(i > fin){
                i = fin;
            }
            this.setProgress(i, ini, fin);
        }
        
        private void mostrar(String msg, long i, long ini, long fin, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);                
            }
            if(i > fin){
                i = fin;
            }
            this.setProgress(i, ini, fin);
        }
    } 
    
    private void loadExplorerView(boolean update){
        
        if(update){
            jTabbedPaneMenuDown.removeAll();
            jTabbedPaneMenuUp.removeAll();
            UtilRender.reloadExplorerTreeView(true);           
        }
        else{
            jTabbedPaneInfo.removeAll();
            jTabbedPaneInfo.addTab("Salida", Utileria.leerRecursoIcono(Utileria.ICONO_LAYOUT_TABPANEL_SALIDA, Utileria.SIZE_ICON_16), UtilRender.objJPanelTabOut);            
        }
        //Carga las Pestañas del Visor Inferior
        jTabbedPaneMenuDown.addTab("Tipos", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_TYPE, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewType);        
        jTabbedPaneMenuDown.addTab("Clases", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_JAR, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewClass);
        jTabbedPaneMenuDown.addTab("Representación Patron", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_BIBLIOTECA, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewAuto);        
        //Carga las Pestañas del Visor Superior        
        jTabbedPaneMenuUp.addTab("Biblioteca", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_BIBLIOTECA, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewLibrary);                
        jTabbedPaneMenuUp.addTab("Paleta", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_GUI, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewPalete);        
        jTabbedPaneMenuUp.addTab("Modelos Estaticos", Utileria.leerRecursoIcono(Utileria.ICONO_RAIZ_JAR, Utileria.SIZE_ICON_16), UtilRender.objJPanelExplorerTreeViewModels);        

    }

    /**
     * Visualiza la estructura de las clases contenidas en el archivo .jar
     * analizado previamente.
     */
    @Action
    public void resultadoClasesMundo() {
       try{
        if(UtilAnalizador.objClases.isEmpty()){
            Utileria.mostrarMensaje(
                    this.getFrame(),
                    Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                    this.getFrame().getTitle(),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        JInternalFrameVisor objVentana = new JInternalFrameVisor(false, UtilAnalizador.objClases, Utileria.leerRecursoTexto("Utileria.msg.titulo.arbol.jar"), Utileria.ARBOL_CLASES);
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }catch(java.lang.NullPointerException ex){}
       
    }

    /**
     * Visualiza la ventana de generación de la interfaz gráfica para clases
     * contenidas en el archivo .jar.
     */
    @Action
    public void crearGUI() {
        JInternalFrameComponentesContenedores objVentana = new JInternalFrameComponentesContenedores();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    /**
     * Visualiza la estructura que contiene las interfaces graficas previamente
     * configuradas.
     */
    @Action
    public void visorClasesGUI() {
        JInternalFrameVisor objVentana = new JInternalFrameVisor(false, this, UtilRepresentacion.objBibliotecaTrabajoLocal, Utileria.leerRecursoTexto("Utileria.msg.titulo.arbol.lib"), Utileria.ARBOL_BIBLIOTECA);
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    /**
     * Esta accion, carga un trabajo previamente almacenado.
     * @return LoadMundoTask @DefinicionReturn
     */
    @Action
    public Task loadProceso() {
        ResourceMap resourceMap = getResourceMap();        
        Utileria.strTempDir = UtilOpciones.objPreferences.getString(MyPreferences.FILE_OPEN_4DOR);
        File objOutPutFileSelected = UtilAnalizador.getFileOpenSelectedModel();
        if(objOutPutFileSelected != null){
            if(objOutPutFileSelected.exists()){                 
                Utileria.objFileJar = objOutPutFileSelected;
                Utileria.strTempDir = objOutPutFileSelected.getParent();
                UtilOpciones.objPreferences.addOpcion(MyPreferences.FILE_OPEN_4DOR, objOutPutFileSelected.getAbsolutePath());
                return new LoadProcesoTask(getApplication(), objOutPutFileSelected);
            }
            else {
                JOptionPane.showInternalMessageDialog(jDesktopPaneApp, resourceMap.getString("msg.noExisteArchivo"));
            }
        }
        return null;
    }

    private class LoadProcesoTask extends org.jdesktop.application.Task<Object, Void> {
        private File objPath;
        LoadProcesoTask(org.jdesktop.application.Application app, File objPath) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to LoadProcesoTask fields, here.
            super(app);
            this.objPath = objPath;
            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("IDENTIFICANDO REFERENCIAS"), 5, 0, 100, 10);            
        }
        @Override@SuppressWarnings({"unchecked", "unchecked"})
        protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.
            ObjectInputStream objLeer = null;
            ArrayList<TipoProcesoSerializado> objEProcesos;
            try {
                objLeer = new ObjectInputStream(new FileInputStream(objPath));                
                objEProcesos = (ArrayList<TipoProcesoSerializado>) objLeer.readObject();
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("LEYENDO LISTA DE PROCESOS"), 1, 0, 100, 20);                
                if(objEProcesos.contains(TipoProcesoSerializado.eTempDir)){
                    //se almacenan los nombres de la clases
                    Utileria.strTempDir = (String) objLeer.readObject();
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("LEYENDO DIRECTORIO TEMPORAL"), 5, 0, 100, 10);
                }
                if(objEProcesos.contains(TipoProcesoSerializado.ePathJar)) {
                    //se almacenan los nombres de la clases
                    Utileria.strPathJar = (String) objLeer.readObject();
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("OBTENIENDO PATH DEL JAR"), 10, 0, 100, 10);
                }
                if(objEProcesos.contains(TipoProcesoSerializado.eLoadJar)){
                    //se almacenan los nombres de la clases
                    JarInputStream jarInput = null;
                    ArrayList<ObjetoReflexion> objClasesMundo = new ArrayList<ObjetoReflexion>();
                    Utileria.objFileJar = (File) objLeer.readObject();
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("PREPARANDO LECTURA DEL JAR"), 20, 0, 100, 10);
                    try{
                        CargadorClases mc = new CargadorClases();
                        mc.addArchivo(Utileria.objFileJar);
                        int i = 0;
                        for (URL url : mc.getURLs()) {
                            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("IDENTIFICANDO OBJETO: ") + url.getFile(), i + 30, 0, 100, 15);
                        }
                        jarInput = new java.util.jar.JarInputStream(new FileInputStream(Utileria.objFileJar));
                        JarEntry jarEntry;
                        UtilAnalizador.objNombresClases = new ArrayList<String>();
                        while ((jarEntry = jarInput.getNextJarEntry()) != null) {
                            String strClase = jarEntry.getName();
                            if(strClase.endsWith(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString(".CLASS"))){
                                strClase = strClase.replace('/', '.');
                                strClase = UtilAnalizador.eliminarExtensionBack(strClase);
                                if (UtilAnalizador.estaRegistradaEnElClassPath(strClase)) {
                                    UtilAnalizador.objNombresClases.add(strClase);
                                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CLASE ") + strClase + java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString(" REGISTRADA."), i++, 0, 100, 15);
                                    Class objClass;
                                    try {
                                        objClass = Class.forName(strClase);
                                        if(UtilAnalizador.estaPresenteModificadorEnClase(objClass, java.lang.reflect.Modifier.ABSTRACT) ||
                                            UtilAnalizador.estaPresenteModificadorEnClase(objClass, java.lang.reflect.Modifier.INTERFACE) ||
                                            objClass.isEnum())continue;
                                        mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("EVALUANDO INSTANCIACIÓN."), i++, 0, 100, 15);
                                        ObjetoReflexion obj = new ObjetoReflexion(UtilAnalizador.crearInstancia(strClase));
                                        objClasesMundo.add(obj);
                                    } catch (ClassNotFoundException ex) {
                                        Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                                    }
                                }
                            }
                        }
                        UtilAnalizador.objClases = objClasesMundo;
                        for(String strClassPath : UtilAnalizador.objNombresClases){
                            UtilRepresentacion.procesarClass(strClassPath);
                            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("INSPECCIONADO TIPOS DE DATOS EN ") + strClassPath, i++, 0, 100, 15);
                        }
                    }catch (NoSuchMethodException ex) {
                        Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                return true;
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    if(objLeer != null){
                        objLeer.close();
                    }                    
                } catch (IOException ex) {
                    Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return null;  // return your result
        }
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
            mostrar("", 100, 0, 100, 10);
            if(result != null){
                BibliotecaTrabajo objBiblioteca =
                        Utileria.cargarBiblioteca(UtilAnalizador.eliminarExtension(objPath.getAbsolutePath()));
                if(objBiblioteca != null){
                    UtilRepresentacion.objBibliotecaTrabajoLocal = objBiblioteca; 
                    if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjPaqueteRoot() != null){
                        UtilRepresentacion.objPaqueteRoot = (PaqueteClass) UtilRepresentacion.objBibliotecaTrabajoLocal.getObjPaqueteRoot().clone();
                    }
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CARGANDO BIBLIOTECA DE COMPONENTES."), 10);                    
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TRABAJO CARGADO CON ÉXITO!!!"), 10);
                    CuatroView.this.openBotones();
                    objBiblioteca.updateIdSerialComponentes();
                    CuatroView.this.loadExplorerView(true);
                    UtilRender.msgInformacion(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TRABAJO CARGADO."));
                }
                else{
                    mostrar("Error al Cargar el Objeto Serializado.", 10);
                    UtilRender.msgInformacion("Error al Cargar el Objeto Serializado");                            
                }                
            }
            else{
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CON ERRORES."), 10);                                                          
                UtilRender.msgInformacion(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ANÁLISIS FINALIZADO CON ERRORES."));
            }            
        }

        private void mostrar(String msg, int i, int ini, int fin, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(i > fin){
                i = fin;
            }
            this.setProgress(i, ini, fin);
        }
        
        private void mostrar(String msg, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            }            
        }
    }

    /**
     * Esta acción guarda el estado del trabajo actualmente procesado.
     * @return @DefinicionReturn
     */
    @Action
    public Task saveProceso() {
        if(UtilAnalizador.objClases.isEmpty() &&
                UtilRepresentacion.objBibliotecaTrabajoLocal.isEmpty()){
                Utileria.mostrarMensaje(
                        CuatroView.this.getFrame(),
                        Utileria.leerRecursoTexto("Utileria.msg.no.save"),
                        CuatroView.this.getFrame().getTitle(),
                        JOptionPane.WARNING_MESSAGE);
                return null;
        }
        javax.swing.JFileChooser fc = new JFileChooser();
        javax.swing.filechooser.FileNameExtensionFilter filter =
            new javax.swing.filechooser.FileNameExtensionFilter(
                Utileria.leerRecursoTexto("Utileria.file.dor.descripcion"),
                Utileria.leerRecursoTexto("Utileria.file.dor.ext"));

        fc.setFileFilter(filter);

        IconoFileChooser objIcono = new IconoFileChooser();
        fc.setFileView(objIcono);

        File fileDir;
        
        Utileria.strTempDir = UtilOpciones.objPreferences.getString(MyPreferences.FILE_SAVE_4DOR);

        if (Utileria.strTempDir.compareTo("") == 0) {
            fc.changeToParentDirectory();
        } else {
            fileDir = new File(Utileria.strTempDir);
            fc.setCurrentDirectory(fileDir);
        }

        int option = fc.showDialog(fc, java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("GUARDAR ANÁLISIS"));

        if (JFileChooser.APPROVE_OPTION == option) {
            Utileria.strTempDir = fc.getSelectedFile().getParent();
            if(fc.getSelectedFile().exists()){
                if(!Utileria.confirmarOrden(getFrame(), java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("¿DESEA REEMPLAZAR EL ARCHIVO?"), ""))
                    return null;
            }
            Utileria.strPathJar = fc.getSelectedFile().getAbsolutePath();
            UtilOpciones.objPreferences.addOpcion(MyPreferences.FILE_SAVE_4DOR, fc.getSelectedFile().getAbsolutePath());
            return new SaveProcesoTask(getApplication(), fc.getSelectedFile());                       
        }
        return null;
    }

    private class SaveProcesoTask extends org.jdesktop.application.Task<Object, Void> {
        private File objPath;
        SaveProcesoTask(org.jdesktop.application.Application app, File objPath) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to SaveProcesoTask fields, here.
            super(app);
            this.objPath = objPath;
            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("IDENTIFICANDO REFERENCIA DEL JAR"), 5, 0, 100, 10);            
        }
        @Override protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.
            ObjectOutputStream objEscribir = null;
            ArrayList<TipoProcesoSerializado> objEProcesos;
            String strPath = objPath.getAbsolutePath();
            strPath = UtilAnalizador.eliminarExtension(strPath);
            strPath += java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString(".") + Utileria.leerRecursoTexto("Utileria.file.dor.ext");
            mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CREANDO EXTENSIÓN DEL ARCHIVO"), 10, 0, 100, 10);
            try {
                objEscribir = new ObjectOutputStream(new FileOutputStream(strPath));
                objEProcesos = Utileria.crearTrabajo();
                objEscribir.writeObject(objEProcesos);
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CREANDO TRABAJO DE PROCESOS"), 25, 0, 100, 20);
                if(objEProcesos.contains(TipoProcesoSerializado.eTempDir)){
                    //se almacenan los nombres de la clases
                    objEscribir.writeObject(Utileria.strTempDir);
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ESCRIBIENDO DIRECTORIO TEMPORAL"), 30, 0, 100, 10);
                }
                if(objEProcesos.contains(TipoProcesoSerializado.ePathJar)){
                    //se almacenan los nombres de la clases
                    objEscribir.writeObject(Utileria.strPathJar);
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ESCRIBIENDO PATH DEL JAR"), 40, 0, 100, 10);
                }
                if(objEProcesos.contains(TipoProcesoSerializado.eLoadJar)){
                    //se almacenan los nombres de la clases
                    objEscribir.writeObject(Utileria.objFileJar);
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("GUARDANDO REFERENCIA DEL JAR"), 50, 0, 100, 10);
                }
                return objEProcesos;
            } catch (IOException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ERROR AL GUARDAR"), 0, 0, 100, 10);
            } finally {
                try {
                    if(objEscribir != null){
                        objEscribir.close();
                    }
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CERRANDO EL TRABAJO"), 90, 0, 100, 10);                    
                } catch (IOException ex) {
                    Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("ERROR AL GUARDAR"), 0, 0, 100, 10);
                }
            }
            return null;  // return your result
        }
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
            if(result != null){
                if(Utileria.guardarBiblioteca(UtilAnalizador.eliminarExtension(objPath.getAbsolutePath()),
                        UtilRepresentacion.objBibliotecaTrabajoLocal)){
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("CREANDO BIBLIOTECA DE REPRESENTACIÓN DE COMPONENTES"), 95, 0, 100, 30);
                    Utileria.mostrarMensaje(getFrame(), java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TRABAJO GUARDADO."), java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("GUARDAR"), JOptionPane.INFORMATION_MESSAGE);
                    mostrar(java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("TRABAJO GUARDADO CON ÉXITO!!!"), 0, 0, 100, 10);                    
                }
            }
        }

        private void mostrar(String msg, int i, int ini, int fin, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(i > fin){
                i = fin;
            }
            this.setProgress(i, ini, fin);
        }
        
        private void mostrar(String msg, int sleep){
            setMessage(msg);
            UtilRender.printlnConsole(msg, UtilRender.ACTION_NORMAL, false);
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException ex) {
                Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
            }            
        }
    }

    /**
     * Esta acción reinicia el estado actual del trabajo analizado.
     */
    @Action
    public void reiniciar() {
        if(UtilAnalizador.objClases.isEmpty()){
            Utileria.mostrarMensaje(
                    this.getFrame(),
                    Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                    this.getFrame().getTitle(),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        if(Utileria.confirmarOrden(getFrame(),
                java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("¿DESEA REINICIAR EL ANÁLISIS INICIADO?"),
                "")){            
           if(UtilController.rebootApp()){
               loadExplorerView(true);
               rebootBotones();
               if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
                    Bandera objBanderaView = new Bandera();
                    objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
                    objBanderaView.setObj(null);
                    objBanderaView.setEstado(Bandera.COMPONENTE_INTEGRADOR_CREADO);
                    objBanderaView.notificar();
                }
           }
        }
    }

    /**
     * Esta acción visualiza el mensaje anterior de la cola de mensajes.
     * @return VerMensajeAnteriorTask @DefinicionReturn
     */
    @Action
    public Task verMensajeAnterior() {
        return new VerMensajeAnteriorTask(getApplication());
    }

    private class VerMensajeAnteriorTask extends org.jdesktop.application.Task<Object, Void> {
        VerMensajeAnteriorTask(org.jdesktop.application.Application app) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to VerMensajeAnteriorTask fields, here.
            super(app);
        }
        @Override protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.            
            return null;  // return your result
        }
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
        }
    }

    /**
     * Esta accion visualiza el mensaje siguiente de la cola de mensajes.
     * @return VerMensajeSiguienteTask @DefinicionReturn
     */
    @Action
    public Task verMensajeSiguiente() {
        return new VerMensajeSiguienteTask(getApplication());
    }

    private class VerMensajeSiguienteTask extends org.jdesktop.application.Task<Object, Void> {
        VerMensajeSiguienteTask(org.jdesktop.application.Application app) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to VerMensajeSiguienteTask fields, here.
            super(app);
        }
        @Override protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.            
            return null;  // return your result
        }
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
        }
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void viewTypeData() {
        if(UtilRepresentacion.objTypesData.isEmpty()){
            Utileria.mostrarMensaje(
                    this.getFrame(),
                    Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                    this.getFrame().getTitle(),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        JInternalFrameVisor objVentana = new JInternalFrameVisor(false, this, UtilRepresentacion.objTypesData, Utileria.leerRecursoTexto("Utileria.msg.titulo.arbol.type"), Utileria.ARBOL_TIPOS);
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void generarComponentes() {
        if(UtilAnalizador.objClases.isEmpty()){
            Utileria.mostrarMensaje(
                    this.getFrame(),
                    Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                    this.getFrame().getTitle(),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }        
        JInternalFrameRepresentaciones objVentana = new JInternalFrameRepresentaciones();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void viewComponentes() {
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void infoAyudaToolTips() {         
        UtilRender.openDialogHelp(CuatroView.class, Utileria.strTituloApp);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButtonAsistenteEspejo;
    private javax.swing.JButton jButtonAyuda;
    private javax.swing.JButton jButtonExit;
    private javax.swing.JButton jButtonLoad;
    private javax.swing.JButton jButtonOpen;
    private javax.swing.JButton jButtonReboot;
    private javax.swing.JButton jButtonSave;
    private javax.swing.JDesktopPane jDesktopPaneApp;
    private javax.swing.JLabel jLabelToolTips;
    private javax.swing.JMenu jMenuHerramientas;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JMenuItem jMenuItemLoad;
    private javax.swing.JMenuItem jMenuItemOpen;
    private javax.swing.JMenuItem jMenuItemReboot;
    private javax.swing.JMenuItem jMenuItemSave;
    private javax.swing.JPopupMenu jPopupMenu1;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator10;
    private javax.swing.JToolBar.Separator jSeparator11;
    private javax.swing.JToolBar.Separator jSeparator12;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JToolBar.Separator jSeparator5;
    private javax.swing.JPopupMenu.Separator jSeparator6;
    private javax.swing.JPopupMenu.Separator jSeparator7;
    private javax.swing.JToolBar.Separator jSeparator8;
    private javax.swing.JPopupMenu.Separator jSeparator9;
    private javax.swing.JSplitPane jSplitPaneApp;
    private javax.swing.JSplitPane jSplitPaneExplorer;
    private javax.swing.JSplitPane jSplitPaneLayout;
    private javax.swing.JTabbedPane jTabbedPaneInfo;
    private javax.swing.JTabbedPane jTabbedPaneMenuDown;
    private javax.swing.JTabbedPane jTabbedPaneMenuUp;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JMenu procesoMenu;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    // End of variables declaration//GEN-END:variables

    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;

    private JDialog aboutBox;

    public void update(Observable o, Object arg) {
        if(o instanceof Bandera){
            Bandera objBandera = (Bandera) o;
            if(objBandera.getEstado() == Bandera.PROCESO_NEW_MSG){
                strLabel = java.util.ResourceBundle.getBundle("com/ufps/cuatro/resources/CuatroView").getString("NUEVO MENSAJE!!!");
            }
        }
    }

    /**
     * @DefinicionMetodo
     */
    public final void initStatesButtoms(){
        if(UtilAnalizador.objClases.isEmpty()){            
            //this.jButtonGUI.setEnabled(false);
            //this.jMenuItemGUI.setEnabled(false);
            this.jButtonLoad.setEnabled(true);
            this.jMenuItemLoad.setEnabled(true);
            this.jButtonOpen.setEnabled(true);
            this.jButtonOpen.setEnabled(true);
            this.jButtonReboot.setEnabled(false);
            this.jMenuItemReboot.setEnabled(false);
            //this.jButtonSave.setEnabled(false);
            //this.jMenuItemSave.setEnabled(false);            
            //this.jButtonViewGUI.setEnabled(false);
            //this.jMenuItemViewGUI.setEnabled(false);            
        }
    }

    /**
     * @DefinicionMetodo
     */
    public final void loadJarBotones(){
        if(!UtilAnalizador.objClases.isEmpty()){            
            //this.jButtonGUI.setEnabled(true);
            //this.jMenuItemGUI.setEnabled(false);
            this.jButtonLoad.setEnabled(false);
            this.jMenuItemLoad.setEnabled(false);
            this.jButtonOpen.setEnabled(true);
            this.jButtonOpen.setEnabled(true);
            this.jButtonReboot.setEnabled(true);
            this.jMenuItemReboot.setEnabled(true);
            //this.jButtonSave.setEnabled(true);
            //this.jMenuItemSave.setEnabled(true);            
            //this.jButtonViewGUI.setEnabled(false);
            //this.jMenuItemViewGUI.setEnabled(false);            
        }
    }

    /**
     * @DefinicionMetodo
     */
    public final void openBotones(){
        loadJarBotones();
    }

    /**
     * @DefinicionMetodo
     */
    public final void rebootBotones(){
        initStatesButtoms();
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void adminBiblioteca() {
//        if(UtilRepresentacion.objLibComponentesGlobales.isEmpty()){
//            Utileria.mostrarMensaje(
//                    this.getFrame(),
//                    "No se han Agregado Componentes a la Biblioteca.",
//                    this.getFrame().getTitle(),
//                    JOptionPane.WARNING_MESSAGE);
//            return;
//        }
        JInternalFrameBibliotecaComponentes objVentana = new JInternalFrameBibliotecaComponentes();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void adminPatrones() {
//        JInternalFrameAdminPatronConfig objVentana = new JInternalFrameAdminPatronConfig();
//        this.jDesktopPaneApp.add(objVentana);
//        objVentana.setVisible(true);
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void adminProperties() {
        JInternalFrameAdminProperties objVentana = new JInternalFrameAdminProperties();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }    

    @Action
    public void historialMSG() {
        JInternalFrameErrores objVentana = new JInternalFrameErrores();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
    }

    @Action
    public void optionApp() {
        JFrame mainFrame;        
        mainFrame = CuatroApp.getApplication().getMainFrame();                
        JDialogPreferencias objDialogCrearComponente = new JDialogPreferencias(this);
        objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
        CuatroApp.getApplication().show(objDialogCrearComponente);
        UtilRender.actualizarLayoutAppExplorer();
    }

    @Action
    public void configuracionCodificacion() {
        JInternalFrameAdministracionCodificacion objVentana = new JInternalFrameAdministracionCodificacion();
        this.jDesktopPaneApp.add(objVentana);
        objVentana.setVisible(true);
        try {
            objVentana.setMaximumSize(Utileria.objEscritorio.getSize());
            objVentana.setMaximum(true);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(CuatroView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Action
    public void salir() {        
        CuatroApp.getApplication().quit(null);        
    }

    @Action
    public void asistenteLibre() {
        if(UtilWizard.runWizard(UtilWizard.WIZARD_ASISTENTE_LIBRE) == 0){
           Integer contenedor = (Integer) UtilWizard.objTempSwap.get(ObjectTempSwapWizard.CONTENEDOR_REPRESENTACION);
           //Crear un Componente Libre
           if(contenedor.intValue() == 1){
               ComponenteDistribuidorIntegradorExtra obj = GeneradorComponentes.construirComponenteIntegradorExtra(UtilWizard.objTempSwap);
               if(obj != null){
                   this.addContenedor(obj);
                   UtilRender.msgInformacion("Contenedor Generado Correctamente.");
               }
           }
           else{
               ComponenteDistribuidorContenedorLibre obj = GeneradorComponentes.construirComponenteAsistenteLibre(UtilWizard.objTempSwap);
               if(obj != null){
                   this.addContenedor(obj);
                   UtilRender.msgInformacion("Contenedor Generado Correctamente.");
               }               
           }
        }
    }

    @Action
    public void asistenteEspejo() {
        if(UtilAnalizador.objClases.isEmpty() &&
                UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().isEmpty()){
                Utileria.mostrarMensaje(
                        CuatroApp.getApplication().getMainFrame(),
                        Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                        "",
                        JOptionPane.WARNING_MESSAGE);
                return;
        }
        if(UtilWizard.runWizard(UtilWizard.WIZARD_ASISTENTE_ESPEJO_STANDARD) == 0){
            //Crear un Componente Espejo
            ComponenteDistribuidorContenedorEspejo obj = GeneradorComponentes.construirComponenteAsistenteEspejo(UtilWizard.objTempSwap);
            if(obj != null){
                this.addContenedor(obj);
                UtilRender.msgInformacion("Contenedor Generado Correctamente.");
            }
        }
    }
    
    private void addContenedor(ComponenteDistribuidorIntegradorExtra obj){ 
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().contains(obj)){
            int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().indexOf(obj);
            UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        else{
            UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
            Bandera objBanderaView = new Bandera();
            objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
            objBanderaView.setObj(obj);
            objBanderaView.setEstado(Bandera.COMPONENTE_INTEGRADOR_CREADO);
            objBanderaView.notificar();
        }
    }
    
    private void addContenedor(ComponenteDistribuidorIntegradorSimple obj){ 
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().contains(obj)){
            int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().indexOf(obj);
            UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        else{
            UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
            Bandera objBanderaView = new Bandera();
            objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
            objBanderaView.setObj(obj);
            objBanderaView.setEstado(Bandera.COMPONENTE_INTEGRADOR_CREADO);
            objBanderaView.notificar();
        }
    }
    
    private void addContenedor(ComponenteDistribuidorContenedorLibre obj){ 
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().contains(obj)){
            int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().indexOf(obj);
            UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        else{
            UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
            Bandera objBanderaView = new Bandera();
            objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
            objBanderaView.setObj(obj);
            objBanderaView.setEstado(Bandera.COMPONENTE_CONTENEDOR_CREADO);
            objBanderaView.notificar();
        }
    }
    
    private void addContenedor(ComponenteDistribuidorContenedorEspejo obj){
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().contains(obj)){
            int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().indexOf(obj);
            UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        else{
            UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
            UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
        }
        if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
            Bandera objBanderaView = new Bandera();
            objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
            objBanderaView.setObj(obj);
            objBanderaView.setEstado(Bandera.COMPONENTE_CONTENEDOR_CREADO);
            objBanderaView.notificar();
        }
    }

    @Action
    public void salirMenu() {
        CuatroApp.getApplication().quit(null);        
    }

    @Action
    public void asistenteEspejoSimple() {
        if(UtilAnalizador.objClases.isEmpty() &&
                UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().isEmpty()){
                Utileria.mostrarMensaje(
                        CuatroApp.getApplication().getMainFrame(),
                        Utileria.leerRecursoTexto("Utileria.msg.no.load.mundo"),
                        "",
                        JOptionPane.WARNING_MESSAGE);
                return;
        }
        if(UtilWizard.runWizard(UtilWizard.WIZARD_ASISTENTE_ESPEJO_SIMPLE) == 0){
            //Crear un Componente Espejo
            ComponenteDistribuidorIntegradorSimple obj = GeneradorComponentes.construirComponenteIntegradorSimple(UtilWizard.objTempSwap);
            if(obj != null){
                this.addContenedor(obj);
                UtilRender.msgInformacion("Contenedor Generado Correctamente.");
            }
        }
    }

    @Action
    public void staticListModeloString() {
        JFrame mainFrame;
        mainFrame = CuatroApp.getApplication().getMainFrame();                
        JDialogList objDialogList = new JDialogList(this);
        objDialogList.setLocationRelativeTo(mainFrame);                
        CuatroApp.getApplication().show(objDialogList);
        UtilRender.objJPanelExplorerTreeViewModels.reloadTreeView();
    }

    @Action
    public void notificaciones() {
        if(!UtilRepresentacion.objBibliotecaTrabajoLocal.getObjNotificacionesModeloAnalizado().isEmpty()){
            UtilRender.abrirVentanaNotificacionesModeloAnalizado();
        }
        else{
            UtilRender.msgAdvertencia("No se han Registrado Notificaciones.");
        }
    }
}